home *** CD-ROM | disk | FTP | other *** search
/ NetNews Offline 2 / NetNews Offline Volume 2.iso / news / comp / lang / c-part1 / 8792 < prev    next >
Encoding:
Text File  |  1996-08-05  |  2.3 KB  |  72 lines

  1. Path: gail.ripco.com!mambuhl
  2. From: mambuhl@ripco.com (Martin Ambuhl)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: Fortran to C conversi
  5. Date: 6 Mar 1996 07:21:46 GMT
  6. Organization: Ripco Communications, Inc.
  7. Message-ID: <4hjeea$qgj@gail.ripco.com>
  8. NNTP-Posting-Host: golden.ripco.com
  9.  
  10. dkolmar@grovestocktn.com (Doug Kolmar) in
  11. <4hf04k$ogs@pipe3.nyc.pipeline.com> asks:
  12.  
  13. >I'm sort of a weekend C programmer so perhaps I've missed something, but
  14. >I'm trying to convert a function in FORTRAN to C.
  15.  
  16. >Attached is the FORTRAN code followed by the C code that I've written. The
  17. >C program will compile and run, but does not yield the correct output. I.E.
  18. >integers in the range 0 to 31.
  19.  
  20. BTW, your posted Fortran code has no label `20' even though it is the target
  21. of `IF (K.GE.1) GOTO 20'.
  22.  
  23. /* First: here is a direct translation of the function: */
  24.  
  25. #include<stdlib.h>              /* for srand(), rand() */
  26. #include<stdio.h>               /* for printf() */
  27. #include<time.h>                /* for time() */
  28.  
  29. int i10vrf(int last)
  30. {                               /* FUNCTION I1OVRF(LAST) */
  31.     int new = 0,                /* NEW=0 */
  32.         k = 16,                 /* K=16 */
  33.         l = last,               /* L=LAST */
  34.         j;
  35.     double probit = 0.03125,    /* PROBIT = .03125 */
  36.         u;
  37.     do {                        /* mha - is this where the label `20'
  38.                                  * goes? */
  39.         j = l / k;              /* J=L/K */
  40.         if (j == 1)
  41.             l -= k;             /* IF (J.EQ.1) L=L-K */
  42.         u = (double) rand() / (RAND_MAX + 1);   /* U=RAND(0) */
  43.         if (u < probit)
  44.             j = 1 - j;          /* IF (U.LT.PROBIT) J=1-J */
  45.         new += j * k;           /* NEW = NEW+J*K */
  46.         k /= 2;                 /* K=K/2 */
  47.         probit *= 2;            /* PROBIT=PROBIT*2 */
  48.     } while (k >= 1);           /* IF (K.GE.1) GO TO 20 */
  49.     return new;                 /* I1OVRF=NEW   */
  50.                                 /* RETURN */
  51. }                               /* END */
  52.  
  53.  
  54. /* and here is a driver to test it */
  55. int main()
  56. {
  57.     int i, last, new = 30;
  58.  
  59.     srand((unsigned) time(NULL));
  60.     for (i = 0; i < 20; ++i) {
  61.         last = new;
  62.         new = i10vrf(last);
  63.         printf("new= %d\n", new);
  64.     }
  65.     return 0;
  66. }
  67.  
  68.                                                           
  69. --
  70. * Martin Ambuhl       net: mambuhl@ripco.com
  71. * Chicago, IL (USA)    
  72.